package Connectivity; import java.util.ArrayList; import java.util.HashMap; import Command.LDrawPart; import Common.Vector3f; import LDraw.Support.type.LDrawGridTypeT; public class ConnectivityManager { private ArrayList<MatrixItem> connectivityMatrixItemList = new ArrayList<MatrixItem>(); private ArrayList<Connectivity> connectivityList = new ArrayList<Connectivity>(); private HashMap<Vector3f, ArrayList<MatrixItem>> studCoordinateMap = new HashMap<Vector3f, ArrayList<MatrixItem>>(); private HashMap<Vector3f, ArrayList<MatrixItem>> holeCoordinateMap = new HashMap<Vector3f, ArrayList<MatrixItem>>(); public void addPart(LDrawPart part) { ArrayList<Connectivity> connList = part .getConnectivityList(); if (connList == null) return; for (Connectivity conn : connList) { connectivityList.add(conn); if (ICustom2DField.class.isInstance(conn)) { ICustom2DField custom2DField = (ICustom2DField) conn; MatrixItem[][] matrix = custom2DField.getMatrixItem(); for (int column = 0; column < matrix.length; column++) for (int row = 0; row < matrix[column].length; row++) { matrix[column][row].updateConnectivityOrientationInfo(); if (optimizeGroupConnectivity(matrix[column][row])) connectivityMatrixItemList.add(matrix[column][row]); } } } // System.out.println(connectivityMatrixItemList.size()); } public void addConn(Connectivity conn) { connectivityList.add(conn); if (ICustom2DField.class.isInstance(conn)) { ICustom2DField custom2DField = (ICustom2DField) conn; MatrixItem[][] matrix = custom2DField.getMatrixItem(); for (int column = 0; column < matrix.length; column++) for (int row = 0; row < matrix[column].length; row++) { matrix[column][row].updateConnectivityOrientationInfo(); if (optimizeGroupConnectivity(matrix[column][row])) connectivityMatrixItemList.add(matrix[column][row]); } } } public void addMatrixItem(MatrixItem matrixItem) { if (optimizeGroupConnectivity(matrixItem)) { connectivityMatrixItemList.add(matrixItem); } } private boolean optimizeGroupConnectivity(MatrixItem item) { Vector3f finePos = LDrawGridTypeT.getSnappedPos(item.getCurrentPos(), LDrawGridTypeT.Fine); boolean retValue = true; if (item.getAltitude() == 29) return false; if (item.getParent() instanceof Hole) { if (holeCoordinateMap.containsKey(finePos) == false) holeCoordinateMap.put(finePos, new ArrayList<MatrixItem>()); else { ArrayList<MatrixItem> victim = new ArrayList<MatrixItem>(); for (MatrixItem eItem : holeCoordinateMap.get(finePos)) { if (eItem.getDirectionVector().hashCode() == item .getDirectionVector().hashCode()) { connectivityMatrixItemList.remove(eItem); victim.add(eItem); retValue = false; } } for (MatrixItem eItem : victim) holeCoordinateMap.remove(eItem); } if (retValue == false) return retValue; if (studCoordinateMap.containsKey(finePos)) { ArrayList<MatrixItem> victim = new ArrayList<MatrixItem>(); for (MatrixItem eItem : studCoordinateMap.get(finePos)) { if (eItem.getDirectionVector().hashCode() == item .getDirectionVector().hashCode()) { connectivityMatrixItemList.remove(eItem); victim.add(eItem); retValue = false; } } for (MatrixItem eItem : victim) studCoordinateMap.remove(eItem); } if (retValue) holeCoordinateMap.get(finePos).add(item); } else { if (studCoordinateMap.containsKey(finePos) == false) studCoordinateMap.put(finePos, new ArrayList<MatrixItem>()); else { ArrayList<MatrixItem> victim = new ArrayList<MatrixItem>(); for (MatrixItem eItem : studCoordinateMap.get(finePos)) { if (eItem.getDirectionVector().hashCode() == item .getDirectionVector().hashCode()) { connectivityMatrixItemList.remove(eItem); victim.add(eItem); retValue = false; } } for (MatrixItem eItem : victim) studCoordinateMap.remove(eItem); } if (retValue == false) return retValue; if (holeCoordinateMap.containsKey(finePos)) { ArrayList<MatrixItem> victim = new ArrayList<MatrixItem>(); for (MatrixItem eItem : holeCoordinateMap.get(finePos)) { if (eItem.getDirectionVector().hashCode() == item .getDirectionVector().hashCode()) { connectivityMatrixItemList.remove(eItem); victim.add(eItem); retValue = false; } } for (MatrixItem eItem : victim) holeCoordinateMap.remove(eItem); } if (retValue) studCoordinateMap.get(finePos).add(item); } return retValue; } public void clear() { holeCoordinateMap.clear(); studCoordinateMap.clear(); connectivityList.clear(); connectivityMatrixItemList.clear(); } public ArrayList<MatrixItem> getConnectivityMatrixItemList() { return new ArrayList<MatrixItem>(connectivityMatrixItemList); } public ArrayList<Connectivity> getConnectivityList() { return new ArrayList<Connectivity>(connectivityList); } public void removePart(LDrawPart part) { ArrayList<Connectivity> connList = part .getConnectivityList(); if (connList == null) return; for (Connectivity conn : connList) { connectivityList.remove(conn); if (ICustom2DField.class.isInstance(conn)) { ICustom2DField custom2DField = (ICustom2DField) conn; MatrixItem[][] matrix = custom2DField.getMatrixItem(); for (int column = 0; column < matrix.length; column++) for (int row = 0; row < matrix[column].length; row++) connectivityMatrixItemList.remove(matrix[column][row]); } } } public void updatePos() { for (Connectivity conn : connectivityList) conn.updateConnectivityOrientationInfo(); for (MatrixItem item : connectivityMatrixItemList) item.updateConnectivityOrientationInfo(); } }